/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.api.das;

import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.mc.sdk.filecenter.dto.FileDTO;
import cn.hallele.ms.filecenter.application.action.file.FileApplicationService;
import cn.hallele.ms.filecenter.application.bo.FileBO;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/23 23:54
 */
@Slf4j
@Component
public class FileDBDas extends ModelDas<FileApplicationService, FileDTO, FileBO> {
    protected FileDBDas(FileApplicationService option) {
        super(option);
    }

    /**
     * 上传文件
     *
     * @param fileDTO 文件传输对象
     * @return 文件信息
     */
    public FileDTO uploadFile(FileDTO fileDTO) {
        return revert(this.option.uploadFile(convert(fileDTO)));
    }


    /**
     * 检查文件是否存在
     *
     * @param md5 md5值
     * @return 如果存在会返回文件信息，否则返回null
     */
    public FileDTO checkExist(String md5) {
        return revert(this.option.checkExist(md5));
    }

    /**
     * 获取文件url地址
     *
     * @param id 文件id
     * @return 文件url
     */
    public String getFileUrl(Long id) {
        return this.option.getFileUrl(id);
    }

    /**
     * 获取文件的url路径，供前端下载/展示，但是有过期时间
     *
     * @param id id
     * @return url
     */
    public String getUrlWithExpires(Long id, int expires) {
        return this.option.getUrlWithExpires(id, expires);
    }

    /**
     * 将T转成E
     *
     * @param fileDTO 被转换者
     * @return S 转换后者
     */
    @Override
    protected FileBO convert(FileDTO fileDTO) {
        return ObjectUtil.map(fileDTO, f -> FileBO.builder()
                .id(f.getId())
                .url(f.getUrl())
                .filename(f.getFilename())
                .action(f.getAction())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .multipartFile(f.getMultipartFile())
                .build());
    }

    /**
     * 将E回转陈T
     *
     * @param fileBO 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected FileDTO revert(FileBO fileBO) {
        return ObjectUtil.map(fileBO, f -> FileDTO.builder()
                .id(f.getId())
                .url(f.getUrl())
                .filename(f.getFilename())
                .action(f.getAction())
                .filetype(f.getFiletype())
                .md5(f.getMd5())
                .fileSize(f.getFileSize())
                .expires(f.getExpires())
                .multipartFile(f.getMultipartFile())
                .build());
    }
}
